package stream;

/**
 * 1. Stream 自己不会存储元素，
 * 2. stream 不会改变源数据。相反，他们会返回一个持有结果的新 stream
 * 3. stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行
 */

import lambda.Employee;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * steam 的三个操作步骤
 * 1. 创建 stream
 * 2. 中间操作
 * 3. 终止操作（终端操作）
 */
public class TestStreamApi1 {
    // 创建 stream
    @Test
    public void test1() {
        // 1. 可以通过 Collection 系列集合提供的 stream() 或 ParallelStream()
        List<String> list = new ArrayList<>();
        Stream<String> stream1 = list.stream();

        // 2. 通过 Arrays 中的静态方法 stream() 获取数组流
        Employee[] employees = new Employee[10];
        Stream<Employee> stream2 = Arrays.stream(employees);

        // 3. 通过 Stream 类中的静态方法 of()
        Stream<String> stream3 = Stream.of("aa", "bb","cc");

        // 4. 创建无限流
        // 4-1. 迭代：从0开始，做x+2的操作。
        Stream<Integer> stream4 = Stream.iterate(0, (x) -> x + 2);
        // 终止操作：限制10个，并且遍历一下（打印从0 开始的10个 +2 操作的数）
//        stream4.limit(10).forEach(System.out::println);
        // 终止操作：无限流，打印从0开始无限个 +2 操作的数
//        stream4.forEach(System.out::println);
        // 4-2. 生成. 无限个随机数
        Stream.generate(() -> Math.random())
                .limit(5) // 限制五个
                .forEach(System.out::println);
    }
}
